#include<iostream>
#include<sstream>
#include<string>
#include<memory>
#include<jsoncpp/json/json.h>
using namespace std;

//json序列化
void serialize()
{
    const char* name = "小明";
    int age = 19;
    float score[]={77.5,88,99.5};

    Json::Value val;//定一个对象val,让Json进行序列化，结果放到val中
    val["姓名"]=name;
    val["年龄"]=age;
    val["成绩"].append(score[0]);
    val["成绩"].append(score[1]);
    val["成绩"].append(score[2]);


    Json::StreamWriterBuilder swb;//智能指针头文件memory;StreamWriter不能直接使用只能通过StreamWriterBuilder来new一个接口实例化
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());//定义一个智能指针指向的对象是 Json::StreamWriter 来进行初始化

    std::stringstream ss;
    int ret = sw->write(val, &ss);//sw指向write进行序列化;如果ret返回为0则成功
    if(ret!=0)
    {
        cout<<"write failed"<<endl;
    }
    cout<<ss.str()<<endl;//如果序列化成功则返回一个字符串
}

//json反序列化
void unserialize(const std::string &str)
{
    Json::Value val;
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    std::string err;
    bool ret = cr->parse(str.c_str(),str.c_str()+str.size(),&val,&err);
    if(ret==false)
    {
        cout<<"parse failed"<<endl;
    }
    cout<<val["姓名"].asString()<<endl;
    cout<<val["年龄"].asString()<<endl;
    int sz = val["成绩"].size();
    for(int i=0;i<sz;i++)
    {
        cout<<val["成绩"][i]<<endl;
    }
}

int main()
{
    std::string str = R"({"姓名":"⼩明", "年龄":18, "成绩":[76.5, 55, 88]})";
    unserialize(str);
    return 0;
}